package com.beidu.lottery.call.service.portal;

import com.baomidou.mybatisplus.extension.service.IService;
import com.beidu.lottery.call.entity.ActivityLotteryPrize;
import com.beidu.lottery.call.entity.dto.ActivityLotteryDTO;
import com.beidu.lottery.call.entity.dto.ActivityLotteryPrizeListDTO;
import com.beidu.lottery.call.entity.query.AssociatedActivityPageQuery;
import com.beidu.lottery.call.entity.vo.ActivityLotteryPrizeVO;
import com.github.pagehelper.PageInfo;


import java.util.List;

/**
 * <p>
 * 抽奖活动奖品关联表 服务类
 * </p>
 *
 * @author tennyson
 * @since 2024-08-30
 */
public interface ActivityLotteryPrizeService extends IService<ActivityLotteryPrize> {

    /**
     * 抽奖活动奖品关联表分页条件查询
     *
     * @param associatedActivityPageQuery 查询参数实体
     * @return PageInfo<ActivityLotteryPrizeListDTO>
     */
    PageInfo<ActivityLotteryPrizeListDTO> associatedActivityPage(AssociatedActivityPageQuery associatedActivityPageQuery);

    /**
     * 总库存数统计
     *
     * @param prizeId 奖品id
     * @return 统计值
     */
    Integer getTotalStock(Integer prizeId);

    /**
     * 根据活动id查询配置的奖品信息
     *
     * @param activityId 活动ID
     */
    List<ActivityLotteryPrizeVO> queryByActivityId(Integer activityId);

    /**
     * 获取奖品池缓存（前端流程）
     * <p>
     * 内部会初始化奖品池和商品库存
     *
     * @param id 活动ID
     * @return 奖品池
     * @author 北渡
     */
    List<ActivityLotteryDTO> getPortalPrizesCache(Integer id);

    /**
     * 增加库存使用量预提交（Producer）
     * <p>
     * 内部使用MQ+分布式锁保证效率和原子性
     *
     * @param id       关联表id（库存表）
     * @param quantity 增加的数量
     * @author 北渡
     */
    void incrInventoryPreSubmit(Integer id, int quantity);

    /**
     * 增加库存使用量（Consumer）
     * <p>
     * 内部使用MQ+分布式锁保证效率和原子性
     *
     * @param id       关联表id（库存表）
     * @param quantity 增加的数量
     * @author 北渡
     */
    void incrInventorySubmit(Integer id, int quantity);

}
